home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / Var_Dump / Renderer / Text.php < prev    next >
PHP Script  |  2004-10-01  |  12KB  |  287 lines

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2004 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 3.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available through the world-wide-web at the following url:           |
  11. // | http://www.php.net/license/3_0.txt.                                  |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Frederic Poeydomenge <frederic.poeydomenge@free.fr>         |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id:
  20.  
  21. require_once 'Var_Dump/Renderer/Common.php';
  22.  
  23. /**
  24.  * A concrete renderer for Var_Dump
  25.  *
  26.  * Returns a text-only representation of a variable
  27.  *
  28.  * @package Var_Dump
  29.  * @category PHP
  30.  * @author Frederic Poeydomenge <frederic.poeydomenge@free.fr>
  31.  */
  32.  
  33. class Var_Dump_Renderer_Text extends Var_Dump_Renderer_Common
  34. {
  35.  
  36.     /**
  37.      * Default configuration options.
  38.      *     show_container  : bool,    Show the root Element or not
  39.      *     show_eol        : string,  String to insert before a newline, or false
  40.      *     mode            : string,  Can be one of the following displaying modes
  41.      *       'compact' = no keys alignment
  42.      *       'normal'  = keys alignment, proportional spacing
  43.      *       'wide'    = keys alignment, wider spacing
  44.      *     offset          : integer, Offset between the start of a group and the content
  45.      *     opening         : string,  Opening character
  46.      *     closing         : string,  Closing character
  47.      *     operator        : string,  Operator symbol
  48.      *     is_html         : bool,    Do we need to htmlspecialchars() the texts
  49.      *     before_text     : string,  Text to insert before the text
  50.      *     after_text      : string,  Text to insert after the text
  51.      *     before_num_key  : string,  Text to insert before a numerical key
  52.      *     after_num_key   : string,  Text to insert after a numerical key
  53.      *     before_str_key  : string,  Text to insert before a string key
  54.      *     after_str_key   : string,  Text to insert after a string key
  55.      *     before_operator : string,  Text to insert before the operator
  56.      *     after_operator  : string,  Text to insert after the operator
  57.      *     before_type     : string,  Text to insert before a type
  58.      *     after_type      : string,  Text to insert after a type
  59.      *     before_value    : string,  Text to insert before a value
  60.      *     after_value     : string,  Text to insert after a value
  61.      * @var    array
  62.      * @access public
  63.      */
  64.     var $defaultOptions = array(
  65.         'show_container'  => TRUE,
  66.         'show_eol'        => FALSE,
  67.         'mode'            => 'compact',
  68.         'offset'          => 2,
  69.         'opening'         => '{',
  70.         'closing'         => '}',
  71.         'operator'        => ' => ',
  72.         'is_html'         => FALSE,
  73.         'before_text'     => '',
  74.         'after_text'      => '',
  75.         'before_num_key'  => '',
  76.         'after_num_key'   => '',
  77.         'before_str_key'  => '',
  78.         'after_str_key'   => '',
  79.         'before_operator' => '',
  80.         'after_operator'  => '',
  81.         'before_type'     => '',
  82.         'after_type'      => '',
  83.         'before_value'    => '',
  84.         'after_value'     => ''
  85.     );
  86.  
  87.     /**
  88.      * Class constructor.
  89.      * @param array $options Parameters for the rendering.
  90.      * @access public
  91.      */
  92.     function Var_Dump_Renderer_Text($options = array())
  93.     {
  94.         $this->setOptions($options);
  95.     }
  96.  
  97.     /**
  98.      * Returns the string representation of a variable.
  99.      * @return string The string representation of the variable.
  100.      * @access public
  101.      */
  102.     function toString()
  103.     {
  104.         $parent = array();
  105.         $stackOffset = array(0);
  106.         $offset = 0;
  107.         $txt = $this->options['before_text'];
  108.         $counter = count($this->family);
  109.         for ($c = 0 ; $c < $counter ; $c++) {
  110.             switch ($this->family[$c]) {
  111.                 case VAR_DUMP_START_GROUP :
  112.                     if(!empty($parent)) {
  113.                         $offset = end($stackOffset)
  114.                             + $this->keyLen[end($parent)]
  115.                             + $this->_len($this->options['operator']);
  116.                         array_push($stackOffset, $offset);
  117.                     }
  118.                     array_push($parent, $c);
  119.                     if ($this->options['show_container'] or $this->depth[$c] > 0) {
  120.                         $txt .= $this->value[$c] . ' ' . $this->options['opening'] . "\n";
  121.                     }
  122.                     break;
  123.                 case VAR_DUMP_FINISH_GROUP :
  124.                     if ($this->depth[$c] > 0) {
  125.                         $offset = $this->depth[$c] * $this->options['offset'];
  126.                         if ($this->options['mode'] == 'wide') {
  127.                             $offset += end($stackOffset);
  128.                         }
  129.                         if (!$this->options['show_container']) {
  130.                             $offset -= $this->options['offset'];
  131.                         }
  132.                         $txt .= str_repeat(' ', $offset);
  133.                     }
  134.                     if ($this->options['show_container'] or $this->depth[$c] > 0) {
  135.                         $txt .= $this->options['closing'] . "\n";
  136.                     }
  137.                     array_pop($parent);
  138.                     array_pop($stackOffset);
  139.                     break;
  140.                 case VAR_DUMP_START_ELEMENT_NUM :
  141.                 case VAR_DUMP_START_ELEMENT_STR :
  142.                     if ($this->depth[$c] > 0) {
  143.                         $offset = $this->depth[$c] * $this->options['offset'];
  144.                         if ($this->options['mode'] == 'wide') {
  145.                             $offset += end($stackOffset);
  146.                         }
  147.                         if(!$this->options['show_container']) {
  148.                             $offset -= $this->options['offset'];
  149.                         }
  150.                         $txt .= str_repeat(' ', $offset);
  151.                     }
  152.                     if ($this->options['mode'] == 'compact') {
  153.                         $txt .= $this->_getStartElement($c);
  154.                         $offset += $this->_len($this->value[$c]);
  155.                     } else {
  156.                         $txt .= sprintf(
  157.                             '%-' . $this->keyLen[end($parent)] . 's',
  158.                             $this->_getStartElement($c)
  159.                         );
  160.                         $offset += $this->keyLen[end($parent)];
  161.                     }
  162.                     $txt .= $this->_getOperator();
  163.                     if ($this->family[$c]==VAR_DUMP_START_ELEMENT_NUM) {
  164.                         $offset +=
  165.                             $this->_len($this->options['before_num_key']) +
  166.                             $this->_len($this->options['after_num_key']);
  167.                     }
  168.                     if ($this->family[$c]==VAR_DUMP_START_ELEMENT_STR) {
  169.                         $offset +=
  170.                             $this->_len($this->options['before_str_key']) +
  171.                             $this->_len($this->options['after_str_key']);
  172.                     }
  173.                     $offset +=
  174.                         $this->_len($this->options['before_operator']) +
  175.                         $this->_len($this->options['operator']) +
  176.                         $this->_len($this->options['after_operator']) +
  177.                         $this->_len($this->options['before_type']) +
  178.                         $this->_len($this->options['after_type']);
  179.                     break;
  180.                 case VAR_DUMP_FINISH_ELEMENT :
  181.                     $txt .= $this->_getFinishElement($c) . "\n";
  182.                     break;
  183.                 case VAR_DUMP_FINISH_STRING :
  184.                     // offset is the value set during the previous pass
  185.                     // in VAR_DUMP_START_ELEMENT_*
  186.                     $txt .= preg_replace(
  187.                         '/(?<=\n)^/m',
  188.                         $this->options['after_value'] .
  189.                             str_repeat(' ', $offset + $this->_len($this->type[$c]) + 1) .
  190.                             $this->options['before_value'],
  191.                         $this->_getFinishElement($c)
  192.                     ) . "\n";
  193.                     break;
  194.             }
  195.         }
  196.         $txt .= $this->options['after_text'];
  197.         return rtrim($txt);
  198.     }
  199.  
  200.     /**
  201.      * Returns the lenght of the shift (string without tags).
  202.      * @param  string $string The string.
  203.      * @return integer Length of the shift.
  204.      * @access private
  205.      */
  206.     function _len($string)
  207.     {
  208.         if ($this->options['is_html']) {
  209.             return strlen(strip_tags($string));
  210.         } else {
  211.             return strlen($string);
  212.         }
  213.     }
  214.  
  215.     /**
  216.      * Returns the operator symbol.
  217.      * @return string The operator symbol.
  218.      * @access private
  219.      */
  220.     function _getOperator()
  221.     {
  222.         $txt = $this->options['before_operator'];
  223.         if ($this->options['is_html']) {
  224.             $txt .= htmlspecialchars($this->options['operator']);
  225.         } else {
  226.             $txt .= $this->options['operator'];
  227.         }
  228.         $txt .= $this->options['after_operator'];
  229.         return $txt;
  230.     }
  231.  
  232.     /**
  233.      * Returns the key of the element.
  234.      * @param integer $c Index of the element.
  235.      * @return string The key of the element.
  236.      * @access private
  237.      */
  238.     function _getStartElement($c)
  239.     {
  240.         $comp = ($this->family[$c] == VAR_DUMP_START_ELEMENT_NUM) ? 'num' : 'str';
  241.         $txt = $this->options['before_'.$comp.'_key'];
  242.         if ($this->options['is_html']) {
  243.             $txt .= htmlspecialchars($this->value[$c]);
  244.         } else {
  245.             $txt .= $this->value[$c];
  246.         }
  247.         $txt .= $this->options['after_'.$comp.'_key'];
  248.         return $txt;
  249.     }
  250.  
  251.     /**
  252.      * Returns the value of the element.
  253.      * @param integer $c Index of the element.
  254.      * @return string The value of the element.
  255.      * @access private
  256.      */
  257.     function _getFinishElement($c)
  258.     {
  259.         $txt = $this->options['before_type'];
  260.         if ($this->options['is_html']) {
  261.             $txt .= htmlspecialchars($this->type[$c]);
  262.         } else {
  263.             $txt .= $this->type[$c];
  264.         }
  265.         $txt .= $this->options['after_type'];
  266.         if (!is_null($this->value[$c])) {
  267.             $txt .= ' ' . $this->options['before_value'];
  268.             if ($this->options['is_html']) {
  269.                 $string = htmlspecialchars($this->value[$c]);
  270.             } else {
  271.                 $string = $this->value[$c];
  272.             }
  273.             if ($this->options['show_eol'] !== FALSE) {
  274.                 $string = str_replace(
  275.                     "\n",
  276.                     $this->options['show_eol'] . "\n",
  277.                     $string
  278.                 );
  279.             }
  280.             $txt .= $string . $this->options['after_value'];
  281.         }
  282.         return $txt;
  283.     }
  284.  
  285. }
  286.  
  287. ?>